蓝桥杯嵌入式 您所在的位置:网站首页 1492 20题20 蓝桥杯嵌入式

蓝桥杯嵌入式

2023-03-21 17:53| 来源: 网络整理| 查看: 265

前言

最近在做题的时候遇到了一个问题,就是单片机与上位机之间的通信出现问题。例如我发送这样一个数组Data:{1,2,3,4},即使用:

HAL_UART_Transmit(&huart1,Data,4,500);

但是上位机并没有收到1,2,3,4这四个数字,而是收到了乱码。同理我使用上位机软件给下位机发送数据时,例如发送:1234,单片机中使用:

HAL_UART_Recieve_IT(&huart1,R_Data,4);

进行接收,我们可以发现收到的数据并不是我们预想当中的1,2,3,4;这究竟是什么原因呢?

原因

造成这样的结果在于上位机给我们发送的是ASCII码,并且上位机接收显示的也是ASCII码,而不是数值大小。

总所周知,ASCII码是由八位二进制小数进行一映射的,从0-127的数字分别对应了不同字符:

也就是说,我们给上位机发 “1”,上位机实际接收到的是0000_0001(B),对应ASCII为SOH(SOH(start of headline) 标题开始),因此上位机并不显示1,而是显示SOH,要想上位机显示1,应该给它发送49(u8)才对。

同理,上位机发送“1“,我们实际接收到的为49(u8),因此应该减去48才为我们需要得到的数字1。

在单片机中,我们的数字一律是实际的数值,我们定义变量时,定义为u8,u6,就是代表无符号的整数,单片机串口发送也是发送这些数值。

而在上位机中,则是发ASCII码,显示ASCII码。

解决办法

即所有发送的数字数据都+48,接收的数据都-48即可。对于字母来说,单片机和上位机都是使用ASCII码表征,因此不需要切换。

值得注意的是,使用单引号这个技巧:

‘A’,‘1’,‘2’

我们如果把发送的数据改成:

uint8_t Data[10]={'1','2','3','4'};

那么这样上位机就可以完美接收到1234。

单引号代表取这个符号的ASCII值,因此比较字符串,可以使用Data[x]=='A',这样的操作进行比较。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有